/*
 * Zirco Browser for Android Copyright (C) 2010 J. Devauchelle and contributors. This program is free software; you can
 * redistribute it and/or modify it under the terms of the GNU General Public License version 3 as published by the Free
 * Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
 * License for more details.
 */

package org.zirco.ui.activities;

import org.zirco.R;
import org.zirco.controllers.Controller;
import org.zirco.model.DbAdapter;
import org.zirco.utils.ApplicationUtils;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.database.Cursor;
import android.os.Bundle;
import android.text.InputType;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.LayoutAnimationController;
import android.view.animation.TranslateAnimation;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.AdapterView.AdapterContextMenuInfo;

/**
 * AdBlocker white list activity.
 */
public class AdBlockerWhiteListActivity extends ListActivity {

    private static final int    MENU_ADD    = Menu.FIRST;
    private static final int    MENU_CLEAR  = Menu.FIRST + 1;

    private static final int    MENU_DELETE = Menu.FIRST + 10;

    private Cursor              mCursor;
    private DbAdapter           mDbAdapter;
    private SimpleCursorAdapter mCursorAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.adblocker_whitelist_activity);

        setTitle(R.string.AdBlockerWhiteListActivity_Title);

        mDbAdapter = new DbAdapter(this);
        mDbAdapter.open();

        registerForContextMenu(getListView());

        fillData();
    }

    @Override
    protected void onDestroy() {
        mDbAdapter.close();
        mCursor.close();
        super.onDestroy();
    }

    /**
     * Fill the list view.
     */
    private void fillData() {
        mCursor = mDbAdapter.getWhiteListCursor();
        startManagingCursor(mCursor);

        String[] from = new String[] { DbAdapter.ADBLOCK_URL };
        int[] to = new int[] { R.id.AdBlockerWhiteListRow_Title };

        mCursorAdapter = new SimpleCursorAdapter(this, R.layout.adblocker_whitelist_row, mCursor, from, to);
        setListAdapter(mCursorAdapter);

        setAnimation();
    }

    /**
     * Set the view loading animation.
     */
    private void setAnimation() {
        AnimationSet set = new AnimationSet(true);

        Animation animation = new AlphaAnimation(0.0f, 1.0f);
        animation.setDuration(100);
        set.addAnimation(animation);

        animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f,
                                           Animation.RELATIVE_TO_SELF, -1.0f, Animation.RELATIVE_TO_SELF, 0.0f);
        animation.setDuration(100);
        set.addAnimation(animation);

        LayoutAnimationController controller = new LayoutAnimationController(set, 0.5f);
        ListView listView = getListView();
        listView.setLayoutAnimation(controller);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);

        long id = ((AdapterContextMenuInfo) menuInfo).id;
        if (id != -1) {
            menu.setHeaderTitle(mDbAdapter.getWhiteListItemById(id));
        }

        menu.add(0, MENU_DELETE, 0, R.string.Commons_Delete);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

        switch (item.getItemId()) {
            case MENU_DELETE:
                mDbAdapter.deleteFromWhiteList(info.id);
                Controller.getInstance().resetAdBlockWhiteList();
                fillData();
                return true;
            default:
                return super.onContextItemSelected(item);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        MenuItem item;
        item = menu.add(0, MENU_ADD, 0, R.string.Commons_Add);
        item.setIcon(R.drawable.ic_menu_add);

        item = menu.add(0, MENU_CLEAR, 0, R.string.Commons_Clear);
        item.setIcon(R.drawable.ic_menu_delete);

        return true;
    }

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {

        switch (item.getItemId()) {
            case MENU_ADD:
                addToWhiteList();
                return true;

            case MENU_CLEAR:
                clearWhiteList();
                return true;
            default:
                return super.onMenuItemSelected(featureId, item);
        }
    }

    /**
     * Add a value to the white list.
     * 
     * @param value The value to add.
     */
    private void doAddToWhiteList(String value) {
        mDbAdapter.insertInWhiteList(value);
        Controller.getInstance().resetAdBlockWhiteList();
        fillData();
    }

    /**
     * Build and show a dialog for user input. Add user input to the white list.
     */
    private void addToWhiteList() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setCancelable(true);
        builder.setIcon(android.R.drawable.ic_input_add);
        builder.setTitle(getResources().getString(R.string.AdBlockerWhiteListActivity_AddMessage));

        builder.setInverseBackgroundForced(true);

        // Set an EditText view to get user input
        final EditText input = new EditText(this);
        input.setInputType(InputType.TYPE_TEXT_VARIATION_URI);
        builder.setView(input);

        builder.setInverseBackgroundForced(true);
        builder.setPositiveButton(getResources().getString(R.string.Commons_Ok), new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                doAddToWhiteList(input.getText().toString());
            }
        });
        builder.setNegativeButton(getResources().getString(R.string.Commons_Cancel),
                                  new DialogInterface.OnClickListener() {

                                      @Override
                                      public void onClick(DialogInterface dialog, int which) {
                                          dialog.dismiss();
                                      }
                                  });
        AlertDialog alert = builder.create();
        alert.show();

    }

    /**
     * Clear the white list.
     */
    private void doClearWhiteList() {
        mDbAdapter.clearWhiteList();
        Controller.getInstance().resetAdBlockWhiteList();
        fillData();
    }

    /**
     * Display a confirmation dialog and clear the white list.
     */
    private void clearWhiteList() {
        ApplicationUtils.showYesNoDialog(this, android.R.drawable.ic_dialog_alert,
                                         R.string.AdBlockerWhiteListActivity_ClearMessage,
                                         R.string.Commons_NoUndoMessage, new DialogInterface.OnClickListener() {

                                             @Override
                                             public void onClick(DialogInterface dialog, int which) {
                                                 dialog.dismiss();
                                                 doClearWhiteList();
                                             }
                                         });
    }

}
